import mainExport from './main-export';
import Vue from 'vue';
import { CombinedVueInstance } from 'vue/types/vue';
import ComponentRenderer from './component-renderer';
export type Component = typeof Vue;
export type component = CombinedVueInstance<Vue, object, object, object, Record<never, any>>;
type exports = Component | {default: Component | null} | null;
/**
 * 判断一个对象是否为 Vue 组件
 * @param Component 要判断是否为 Vue 组件的对象
 */
function isComponent(Component?: any): boolean {
	return Boolean(typeof Component === 'function' && typeof Component.prototype.$mount === 'function');
}
/**
 * 渲染 Vue 组件
 * @param Component 要渲染的 Vue 组件
 * @param props 渲染时的参数
 * @param htmlElement 要渲染出此组件的 HTMLElement
 * @returns 返回创建的实例
 */
function renderComponent(Component: Component, props: object, htmlElement: HTMLElement): component {
	const component = new Component({propsData: props});
	component.$mount(htmlElement);
	return component;
}
const componentRenderer = new ComponentRenderer(isComponent, renderComponent);

/**
 * 异步从一个模块的导出中获取 Vue 组件
 * @param Component 模块的导出，默认为入口模块
 * @description 支持 ES Module 和 CJS 两种模块形式的导出
 * @description 对于 ES Module ，为其默认导出
 */
export function get(Component: exports | Promise<exports> = mainExport): Promise<Component | undefined> {
	return componentRenderer.get(Component);
}
/**
 * 渲染 Vue 组件到指定 HTMLElement 上
 * @param Component 要渲染的 Vue 组件
 * @param htmlElement 要渲染出此组件的 HTMLElement
 * @returns 返回创建的实例
 */
export function render(Component: Component, htmlElement: HTMLElement): component;
/**
 * 渲染 Vue 组件
 * @param Component 要渲染的 Vue 组件
 * @param props 渲染时的参数，如果留空则为 {}
 * @param htmlElement 要渲染出此组件的 HTMLElement，如果留空则通过 create-element 模块自动创建
 * @returns 返回创建的实例
 */
export function render(Component: Component, props?: object, htmlElement?: HTMLElement): component;
export function render(Component: Component, props?: object | HTMLElement, htmlElement?: HTMLElement): component {
	return componentRenderer.render(Component, props, htmlElement);
}
/**
 * 异步渲染默认导入的 Vue 组件到指定 HTMLElement 上
 * @param htmlElement 要渲染出此组件的 HTMLElement
 * @returns 如果默认导出的为 Vue 组件，将返回创建的实例
 */
export function renderDefault(htmlElement: HTMLElement): Promise<component | undefined>;
/**
 * 异步渲染默认导入的 Vue 组件
 * @param props 渲染时的参数，如果留空则为 {}
 * @param htmlElement 要渲染出此组件的 HTMLElement，如果留空则通过 create-element 模块自动创建
 * @returns 如果默认导出的为 Vue 组件，将返回创建的实例
 */
export function renderDefault(props?: object, htmlElement?: HTMLElement): Promise<component | undefined>;
export function renderDefault(props?: object | HTMLElement, htmlElement?: HTMLElement): Promise<component | undefined> {
	return componentRenderer.renderDefault(props, htmlElement);
}

export {
	get as getComponent,
	get as getVueComponent,
	render as renderComponent,
	render as renderVueComponent,
	renderDefault as renderDefaultComponent,
	renderDefault as renderDefaultVueComponent,
}
export default renderDefault;
